package cxydmmszl.chapter05.t090.middle;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * <li style="color: red;">Prob</li>
 * 括号字符串的最长有效长度
 * <li style="color: green;">Desc</li>
 * 给定一个括号字符串str，返回最长的能够完全正确匹配括号字符字串的长度。
 * <li style="color: green;">Input</li>
 * 输出一行字符串，代表 str（1≤length(str)≤10^5）。
 * <li style="color: green;">Output</li>
 * 输出一个整数，代表括号字符串的最长有效长度。
 * <li style="color: blue;">Link</li> CD127
 *
 * @author habitplus
 * @since 2021-09-12 16:40
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        br.close();

        int ans = maxLen(str);
        System.out.println(ans);
    }

    private static int maxLen(String str) {
        if (str == null || str.length() < 2) {
            return 0;
        }
        char[] chs = str.toCharArray();
        int n = chs.length;
        // dp[i] 表示以 str[i] 结尾的最长有效括号字符串的长度
        int[] dp = new int[n];
        int ans = 0;
        for (int i = 1; i < n; i++) {
            if (chs[i] == ')') {
                int j = i - dp[i - 1] - 1;
                if (j >= 0 && chs[j] == '(') {
                    dp[i] = dp[i - 1] + 2 + (j > 0 ? dp[j - 1] : 0);
                }
            }
            ans = Math.max(ans, dp[i]);
        }

        return ans;
    }
}
